/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gui;

import classe.controlador.MaterialJpaController;
import classe.entidade.Material;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import javax.persistence.PersistenceException;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Kellison
 */
public class CatalogoMateriais extends javax.swing.JDialog {

    /**
     * Creates new form CatalogoMateriais
     */
    public CatalogoMateriais(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();

        this.setLocationRelativeTo(rootPane);

        // Se for aberta em modo MODAL (Janela de dialog) esconde os botões de edição e exclusão
        // e habilita para uso o botão de seleção de materiais
        if (modal == true) {
            btnEditar.setVisible(false);
            btnExcluir.setVisible(false);
            btnSelecionarMaterial.setEnabled(true);
        }


    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        grupoBtnPesquisa = new javax.swing.ButtonGroup();
        jScrollPane1 = new javax.swing.JScrollPane();
        tblMateriais = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        txtTermoPesquisa = new javax.swing.JTextField();
        btnBuscar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        btnSelecionarMaterial = new javax.swing.JButton();
        btnExcluir = new javax.swing.JButton();
        btnEditar = new javax.swing.JButton();
        btnFechar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Catálogo de Materiais");
        setType(java.awt.Window.Type.UTILITY);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        tblMateriais.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Descrição", "Unid. Medida"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        tblMateriais.setName("tblMateriais"); // NOI18N
        tblMateriais.getTableHeader().setReorderingAllowed(false);
        tblMateriais.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tblMateriaisKeyReleased(evt);
            }
        });
        jScrollPane1.setViewportView(tblMateriais);
        tblMateriais.getColumnModel().getColumn(0).setMinWidth(50);
        tblMateriais.getColumnModel().getColumn(0).setMaxWidth(50);
        tblMateriais.getColumnModel().getColumn(2).setMinWidth(90);
        tblMateriais.getColumnModel().getColumn(2).setMaxWidth(90);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("  Filtro  "));

        txtTermoPesquisa.setName("txtTermoPesquisa"); // NOI18N
        txtTermoPesquisa.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                txtTermoPesquisaKeyPressed(evt);
            }
        });

        btnBuscar.setText("Buscar");
        btnBuscar.setName("btnBuscar"); // NOI18N
        btnBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnBuscarActionPerformed(evt);
            }
        });

        jLabel1.setText("Nome básico:");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGap(6, 6, 6)
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(txtTermoPesquisa, javax.swing.GroupLayout.DEFAULT_SIZE, 392, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(btnBuscar)
                .addGap(112, 112, 112))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(txtTermoPesquisa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addComponent(btnBuscar)
                .addComponent(jLabel1))
        );

        btnSelecionarMaterial.setText("Selecionar Material");
        btnSelecionarMaterial.setEnabled(false);
        btnSelecionarMaterial.setName("btnSelecionarMaterial"); // NOI18N
        btnSelecionarMaterial.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSelecionarMaterialActionPerformed(evt);
            }
        });

        btnExcluir.setText("Excluir");
        btnExcluir.setName("btnExcluir"); // NOI18N
        btnExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExcluirActionPerformed(evt);
            }
        });

        btnEditar.setText("Editar");
        btnEditar.setName("btnEditar"); // NOI18N
        btnEditar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnEditarActionPerformed(evt);
            }
        });

        btnFechar.setText("Fechar");
        btnFechar.setName("btnFechar"); // NOI18N
        btnFechar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnFecharActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnSelecionarMaterial)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(btnEditar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btnExcluir)
                        .addGap(158, 158, 158)
                        .addComponent(btnFechar))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 673, Short.MAX_VALUE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 260, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnEditar)
                    .addComponent(btnExcluir)
                    .addComponent(btnSelecionarMaterial)
                    .addComponent(btnFechar))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnBuscarActionPerformed
        validaCampoBusca();
    }//GEN-LAST:event_btnBuscarActionPerformed

    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
        // preencherTabela("",true);
    }//GEN-LAST:event_formWindowOpened

    private void btnExcluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExcluirActionPerformed
        excluirLinha();
    }//GEN-LAST:event_btnExcluirActionPerformed
//...
    private void btnFecharActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnFecharActionPerformed
        this.dispose();
    }//GEN-LAST:event_btnFecharActionPerformed

    private void btnSelecionarMaterialActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSelecionarMaterialActionPerformed
        int linha = -1;
        if (verificaTabelaPreenchida()) {
            // Pega a linha selecionada
            linha = tblMateriais.getSelectedRow();
        } else {
            JOptionPane.showMessageDialog(rootPane, "A tabela não possui nenhum registro a ser selecionado.");
        }

        if (linha > -1) {
            this.dispose();
        }
    }//GEN-LAST:event_btnSelecionarMaterialActionPerformed

    private void tblMateriaisKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tblMateriaisKeyReleased
        if (evt.getExtendedKeyCode() == KeyEvent.VK_DELETE) {
            excluirLinha();
        }
    }//GEN-LAST:event_tblMateriaisKeyReleased

    private void txtTermoPesquisaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtTermoPesquisaKeyPressed
        if (evt.getExtendedKeyCode() == KeyEvent.VK_ENTER) {
            validaCampoBusca();
        }
    }//GEN-LAST:event_txtTermoPesquisaKeyPressed

    private void btnEditarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnEditarActionPerformed
        preparaMaterialEdicao();
    }//GEN-LAST:event_btnEditarActionPerformed

    /**
     * Verifica se o campo de busca está preenchido e realiza a busca, caso não
     * esteja preenchido, mostra uma mensagem predindo seu preenchimento.
     */
    private void validaCampoBusca() {
        if (!txtTermoPesquisa.getText().equals("")) {
            preencherTabela('P', txtTermoPesquisa.getText());
        } else {
            JOptionPane.showMessageDialog(rootPane, "Por favor, preencha o campo com um valor para pesquisa.");
        }

    }

    /**
     * Esvazia a tabela (retirando os registros da visualização da tabela)
     */
    private void limparTabela() {
        DefaultTableModel materialModel = (DefaultTableModel) tblMateriais.getModel();

        // Captura o número de linhas da tabela 
        int numeroLinhas = materialModel.getRowCount();

        // Remove as linhas da tabela
        for (int i = 0; i < numeroLinhas; i++) {
            materialModel.removeRow(0);
        }
    }

    /**
     * Chama o método que preenche a tabela com todos os registros da tabela do
     * banco de dados, colocando os valores padrões dos parâmetros.
     */
    public void preencherTabela() {
        preencherTabela(' ', "");
    }

    /**
     * Preenche a tabela com o resultado da consulta, caso não tenha encontrado
     * nenhum registro, exibe uma mensagem de notificação
     *
     * @param tipo 'T' : Todos os registros <br> 'P' : traz o resultado com
     * filtro
     */
    private void preencherTabela(char tipo, String termoBusca) {
        limparTabela();

        MaterialJpaController daoMaterial = new MaterialJpaController();
        ArrayList<Material> arrayMaterial = new ArrayList<Material>();

        try {

            // Captura todas os materiais
            if (tipo == 'T') {
                arrayMaterial.addAll(daoMaterial.findMaterialEntities());
            } // Captura os materiais, filtrando o resultado com o valor passado pelo parâmetro do método
            else if (tipo == 'P') {
                arrayMaterial.addAll(daoMaterial.findMaterial("nomeBasico", termoBusca));
            }
        } catch (PersistenceException e) {
            JOptionPane.showMessageDialog(rootPane, "Ocorreu um erro durante a conexão com o banco de dados.");
        }

        Iterator iterator = arrayMaterial.iterator();
        // Percorre todo o array dos materiais
        while (iterator.hasNext()) {
            Material material = (Material) iterator.next();
            Object[] linha;

            // Adiciona os valores dos campos a variável do tipo objeto "linha"
            // que será usada para preencher a tabela com as três colunas
            linha = new Object[]{material.getId(),
                material.getNomeBasico().toUpperCase(),
                material.getUnidadeMedida().toUpperCase()};

            // Pega o modelo da tabela, e em seguida adiciona uma linha com os dados atribuidos a 
            // do tipo objeto acima
            DefaultTableModel catalogoModel = (DefaultTableModel) tblMateriais.getModel();
            catalogoModel.addRow(linha);

        }

    }

    /**
     * Exvlui um material da tabela/banco de dados
     */
    private void excluirLinha() {
        boolean excluir;
        int resposta;
        int linha = -1, idMaterial = -1;

        if (verificaTabelaPreenchida()) {
            // Pega a linha selecionada
            linha = tblMateriais.getSelectedRow();
        } else {
            JOptionPane.showMessageDialog(rootPane, "A tabela não possui nenhum registro a ser selecionado.");
        }

        // Se algum registro tiver sido selecionado
        if (linha > -1) {

            // Captura o valor do id da linha selecionada
            idMaterial = (int) tblMateriais.getValueAt(linha, 0);

            resposta = JOptionPane.showConfirmDialog(null, "Tem certeza que deseja excluir esse material?", "", JOptionPane.YES_NO_OPTION);

            // Se o usuário confirmar a exclusão
            if (resposta == JOptionPane.YES_OPTION) {
                try {

                    MaterialJpaController daoMaterial = new MaterialJpaController();
                    // Tenta excluir o registro, e armazena o valor retornada na variável excluir
                    excluir = daoMaterial.destroy(idMaterial);

                    String termoBusca = "";
                    char tipo = 'T';

                    if (excluir) {
                        JOptionPane.showMessageDialog(rootPane, "Material excluído com sucesso.");

                        // Excluir o material e deixa a tabela no estado anterior a exclusão, mas sem o item excluído
                        if (!txtTermoPesquisa.getText().equals("")) {
                            termoBusca = txtTermoPesquisa.getText();
                            tipo = 'P';
                        }
                        preencherTabela(tipo, termoBusca);
                    }

                } catch (Exception exc) {
                    JOptionPane.showMessageDialog(rootPane, "Erro ao tentar excluir o material");
                }
            }
        } else {
            if (verificaTabelaPreenchida()) {
                JOptionPane.showMessageDialog(rootPane, "Por favor, selecione um dos materiais da tabela.");
            }
        }


    }

    /**
     * Captura o material (como um objeto) e envia-o para o formulário de materiais,
     * preenchendo os campos do formulário. 
     */
    private void preparaMaterialEdicao(){
        if (verificaTabelaPreenchida()) {
            int linha = tblMateriais.getSelectedRow();
            if (linha > -1) {
                int id = (int) tblMateriais.getValueAt(linha, 0);

                FormMaterial formMaterial = new FormMaterial();
                formMaterial.preencherCampos(new MaterialJpaController().findMaterial(id));
                formMaterial.visibilidadeBotoes(2);
                formMaterial.setVisible(true);
            } else {
                JOptionPane.showMessageDialog(rootPane, "Por favor, selecione um material na tabela para edição.");
            }

        }
    }
    
    /**
     * Verifica se a tabela está vazia ou preenchida
     *
     * @return boolean
     */
    private boolean verificaTabelaPreenchida() {
        if (tblMateriais.getRowCount() > 0) {
            return true;
        }

        return false;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(CatalogoMateriais.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(CatalogoMateriais.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(CatalogoMateriais.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(CatalogoMateriais.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the dialog */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                CatalogoMateriais dialog = new CatalogoMateriais(new javax.swing.JFrame(), false);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {
                    @Override
                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnBuscar;
    private javax.swing.JButton btnEditar;
    private javax.swing.JButton btnExcluir;
    private javax.swing.JButton btnFechar;
    private javax.swing.JButton btnSelecionarMaterial;
    private javax.swing.ButtonGroup grupoBtnPesquisa;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable tblMateriais;
    private javax.swing.JTextField txtTermoPesquisa;
    // End of variables declaration//GEN-END:variables
}
